/**
 *
 */
package com.demo.util.http;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.cert.CertificateException;
import java.util.*;

import com.demo.util.SSLClient;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.net.ssl.*;

/**
 * http工具类
 * @author bxwan@iflytek.com
 */
public class HttpUtils {

    private static Logger logger = LoggerFactory.getLogger(HttpUtils.class);

    private static final int TIMEOUT_IN_MILLIONS = 5000;

    public interface CallBack
    {
        void onRequestComplete(String result);
    }


    /**
     * 异步的Get请求
     *
     * @param urlStr
     * @param callBack
     */
    public static void doGetAsyn(final String urlStr, final CallBack callBack)
    {
        new Thread()
        {
            public void run()
            {
                try
                {
                    String result = doGet(urlStr);
                    if (callBack != null)
                    {
                        callBack.onRequestComplete(result);
                    }
                } catch (Exception e)
                {
//                     e.printStackTrace();
                    logger.error(e.getMessage());

                }

            };
        }.start();
    }

    /**
     * 异步的Post请求
     * @param urlStr
     * @param params
     * @param callBack
     * @throws Exception
     */
    public static void doPostAsyn(final String urlStr, final String params,
                                  final CallBack callBack) throws Exception
    {
        new Thread()
        {
            public void run()
            {
                try
                {
                    String result = doPost(urlStr, params);
                    if (callBack != null)
                    {
                        callBack.onRequestComplete(result);
                    }
                } catch (Exception e)
                {
//                     e.printStackTrace();
                    logger.error(e.getMessage());

                }


            };
        }.start();

    }

    /**
     * Get请求，获得返回数据
     *
     * @param urlStr
     * @return
     * @throws Exception
     */
    public static String doGet(String urlStr)
    {
        URL url = null;
        HttpURLConnection conn = null;
        InputStream is = null;
        ByteArrayOutputStream baos = null;
        try
        {
            url = new URL(urlStr);
            conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(TIMEOUT_IN_MILLIONS);
            conn.setConnectTimeout(TIMEOUT_IN_MILLIONS);
            conn.setRequestMethod("GET");
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("Content-Type",
                    "application/x-www-form-urlencoded");
            conn.setRequestProperty("charset", "utf-8");
            if (conn.getResponseCode() == 200)
            {
                is = conn.getInputStream();
                baos = new ByteArrayOutputStream();
                int len = -1;
                byte[] buf = new byte[128];

                while ((len = is.read(buf)) != -1)
                {
                    baos.write(buf, 0, len);
                }
                baos.flush();
                String content = new String(baos.toByteArray(),"utf-8");
                return content;
            } else
            {
                throw new RuntimeException(" responseCode is not 200 ... ");
            }

        } catch (Exception e)
        {
            //e.printStackTrace();
            logger.error(e.getMessage());

        } finally
        {
            try
            {
                if (is != null)
                    is.close();
            } catch (IOException e)
            {
            }
            try
            {
                if (baos != null)
                    baos.close();
            } catch (IOException e)
            {
            }
            conn.disconnect();
        }

        return null ;

    }

    public static String doGetAndHeader(String urlStr,Map<String, String> headParams)
    {
        URL url = null;
        HttpURLConnection conn = null;
        InputStream is = null;
        ByteArrayOutputStream baos = null;
        try
        {
            url = new URL(urlStr);
            conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(TIMEOUT_IN_MILLIONS);
            conn.setConnectTimeout(TIMEOUT_IN_MILLIONS);
            conn.setRequestMethod("GET");
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("Content-Type",
                    "application/x-www-form-urlencoded");
            conn.setRequestProperty("charset", "utf-8");
            if(headParams!=null){
                for(String key : headParams.keySet()){
                    conn.setRequestProperty(key, headParams.get(key));
                }
            }
            if (conn.getResponseCode() == 200)
            {
                is = conn.getInputStream();
                baos = new ByteArrayOutputStream();
                int len = -1;
                byte[] buf = new byte[128];

                while ((len = is.read(buf)) != -1)
                {
                    baos.write(buf, 0, len);
                }
                baos.flush();
                String content = new String(baos.toByteArray(),"utf-8");
                return content;
            } else
            {
                throw new RuntimeException(" responseCode is not 200 ... ");
            }

        } catch (Exception e)
        {
            e.printStackTrace();
            logger.error(e.getMessage());

        } finally
        {
            try
            {
                if (is != null)
                    is.close();
            } catch (IOException e)
            {
            }
            try
            {
                if (baos != null)
                    baos.close();
            } catch (IOException e)
            {
            }
            conn.disconnect();
        }

        return null ;

    }



    public static byte[] doGetByte(String urlStr)
    {
        URL url = null;
        HttpURLConnection conn = null;
        InputStream is = null;
        ByteArrayOutputStream baos = null;
        try
        {
            url = new URL(urlStr);
            conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(TIMEOUT_IN_MILLIONS);
            conn.setConnectTimeout(TIMEOUT_IN_MILLIONS);
            conn.setRequestMethod("GET");
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("Content-Type",
                    "application/x-www-form-urlencoded");
            conn.setRequestProperty("charset", "utf-8");
            if (conn.getResponseCode() == 200)
            {
                is = conn.getInputStream();
                baos = new ByteArrayOutputStream();
                int len = -1;
                byte[] buf = new byte[128];

                while ((len = is.read(buf)) != -1)
                {
                    baos.write(buf, 0, len);
                }
                baos.flush();
                return buf;
            } else
            {
                throw new RuntimeException(" responseCode is not 200 ... ");
            }

        } catch (Exception e)
        {
//             e.printStackTrace();
            logger.error(e.getMessage());
        } finally
        {
            try
            {
                if (is != null)
                    is.close();
            } catch (IOException e)
            {
            }
            try
            {
                if (baos != null)
                    baos.close();
            } catch (IOException e)
            {
            }
            conn.disconnect();
        }

        return null ;

    }


    /**
     * 向指定 URL 发送POST方法的请求
     *
     * @param url
     *            发送请求的 URL
     * @param param
     *            请求参数，请求参数应该是 name1=value1&name2=value2 的形式。
     * @return 所代表远程资源的响应结果
     * @throws Exception
     */
    public static String doPost(String url, String param)
    {
        PrintWriter out = null;
        BufferedReader in = null;
        String result = "";
        try
        {
            URL realUrl = new URL(url);
            // 打开和URL之间的连接
            HttpURLConnection conn = (HttpURLConnection) realUrl
                    .openConnection();
            // 设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type",
                    "application/json");
            conn.setRequestProperty("charset", "utf-8");
            conn.setUseCaches(false);
            // 发送POST请求必须设置如下两行
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setReadTimeout(TIMEOUT_IN_MILLIONS);
            conn.setConnectTimeout(TIMEOUT_IN_MILLIONS);

            if (param != null && !param.trim().equals(""))
            {
                // 获取URLConnection对象对应的输出流
                out = new PrintWriter(conn.getOutputStream());
                OutputStreamWriter out1 = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
                // 发送请求参数
//                 out.print(param);
                out1.write(param);
                // flush输出流的缓冲
//                 out.flush();
                out1.flush();
            }
            // 定义BufferedReader输入流来读取URL的响应
            in = new BufferedReader(
                    new InputStreamReader(conn.getInputStream()));
            String line = in.readLine();
            if(line != null){
                result += line;
            }
        } catch (Exception e)
        {
            e.printStackTrace();
            logger.error(e.getMessage());
        }
        // 使用finally块来关闭输出流、输入流
        finally
        {
            try
            {
                if (out != null)
                {
                    out.close();
                }
                if (in != null)
                {
                    in.close();
                }
            } catch (IOException ex)
            {
                ex.printStackTrace();
            }
        }
        return result;
    }

    public static String post(String url,Map<String,String> map){
        HttpClient client = null;
        PostMethod post = null;
        String result = "";
        int status = 200;
        try {
            client = new HttpClient();
            post = new PostMethod(url);
            post.addRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8");
            String key = "";
            String value = "";
            NameValuePair[] params = getNameValuePair(map);
            post.setRequestBody(params);
            status = client.executeMethod(post);
            if(status == 200){
                result = post.getResponseBodyAsString();
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        finally{
            post.releaseConnection();
        }
        return result;
    }

    public static NameValuePair[] getNameValuePair(Map<String,String> map){
        List<NameValuePair> list = new ArrayList<NameValuePair>();
        NameValuePair param = null;
        for(String key:map.keySet()){
            param  = new NameValuePair();
            param.setName(key);
            param.setValue(map.get(key));
            list.add(param);
        }
        NameValuePair[] params = new NameValuePair[list.size()];
        return list.toArray(params);
    }


    public static String rongyibanDoPost(String url, String param, Map<String, String> headers) {
        SSLClient sslClient = null;
        HttpPost httpPost = null;
        String result = null;
        try{
            sslClient = new SSLClient();
            httpPost = new HttpPost(url);
            httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
            if (null != headers && headers.size() > 0) {
                Set<String> keys = headers.keySet();
                for (String key : keys) {
                    httpPost.addHeader(key, headers.get(key));
                }
            }
//            StringEntity se = new StringEntity("jsonData='" + param + "'");
//            se.setContentType("application/x-www-form-urlencoded");
//            se.setContentEncoding(new BasicHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"));
            List<BasicNameValuePair> pairs = new ArrayList<BasicNameValuePair>();
            pairs.add(new BasicNameValuePair("jsonData", param));
            StringEntity se = new UrlEncodedFormEntity(pairs, HTTP.UTF_8);
            httpPost.setEntity(se);
            HttpResponse response = sslClient.execute(httpPost);
            if(response != null){
                HttpEntity resEntity = response.getEntity();
                if(resEntity != null){
                    result = EntityUtils.toString(resEntity, "utf-8");
                }
            }
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return result;
    }




    public static void main(String[] args) {
        Map<String,String> map=new HashMap<>();
        map.put("appkey","808377220081909760");
        String aa=rongyibanDoPost(" https://10.1.235.51:4433/gateway/api/1/wllz/bjsqtjbsl/cs","{\"params\":{\"contactperson\":\"王大发\",\"applyersex\":\"1\",\"recaddress\":\"\",\"task_id\":\"4095228430265122816\",\"source\":\"MDMyMjE0NTg0MTU3\",\"areacode\":\"510104000000\",\"applydate\":\"\",\"applyway\":\"20\",\"certtype\":\"22\",\"oucode\":\"\",\"contactmobile\":\"15527601355\",\"recname\":\"\",\"projectguid\":\"\",\"eventcode\":\"511A0000800001-510104000000-000-115101047949410713-1-00\",\"projectname\":\"出版物零售单位和个体工商户设立审批\",\"tasktype\":\"1A\",\"address\":\"四川省成都市\",\"receiveuserphone\":\"13982011661\",\"ouguid\":\"\",\"receiveusername\":\"刘华\",\"applyertype\":\"20\",\"ouorgnum\":\"\",\"receivedate\":\"2021-05-08 09:40:59\",\"receiveuseridcard\":\"510113196810220465\",\"recphone\":\"\",\"applyername\":\"王大发\",\"certnum\":\"540025198501121311\",\"ouname\":\"成都市锦江区行政审批局\"},\"token\":\"Epoint_WebSerivce_**##0601\"}",map);
        System.out.println(aa);
    }



}
